/**
 * Author: 笨蛋超人不会飞
 * Date:  15:30
 */
public class question_61 {
}
class Solution_61 {
    public ListNode rotateRight(ListNode head, int k) {
//        特殊判断
        if(head==null||head.next==null){
            return head;
        }
//        先了解这个listnode有多长,同时将这个链表进行头尾相连，变成一个环形的链表
        int len=0;
        ListNode index=head;
        while (index!=null){
            len++;
//            最后一个要做特殊的处理
            if(index.next==null){
                index.next=head;
                break;
            }
            index=index.next;
        }
//        到这里已经知道了链表的长度和有了环形的链表
//        先对k进行取余的处理
        k=k%len;
        int sum=0;
//        单数在环形循环的啥时候就不会出现死循环的情况，但是len为偶数的时候就会，所以要用另外的处理方式，所以下面做不同的分类求解
        ListNode r;
        if(len%2==1){
            sum=0;
             r=head;
            int last=head.val ;
            int temp=0;
            while (sum<len){

                for (int i = 0; i < k; i++) {
                    r=r.next;
                }
//                接下来要进行值的替换了
                temp=r.val;
                r.val=last;
                last=temp;
                sum++;
            }
        }else{
//            条件要重置一下
            sum=0;
            ListNode tag=head;
            while (true){
                if(sum==len){
                    break;
                }
                r=tag;
                int last=tag.val ;
                int temp=0;
                while (sum<len){

                    for (int i = 0; i < k; i++) {
                        r=r.next;
                    }
//                接下来要进行值的替换了
                    temp=r.val;
                    r.val=last;
                    last=temp;
                    sum++;
                    if(r==tag){
//                        说明走完一圈又重新回来了
                        r=tag.next;
                        tag=r;
                        break;

                    }
                }
            }


        }
        int temp_len=0;
        ListNode temp_index=head;
        while (temp_len<len-1){
            temp_index=temp_index.next;
            temp_len++;
        }
        temp_index.next=null;
        return head;


    }
}
